Análisis de Presión, PM2.5 y Precipitación de estación Compartir

Análisis de Presión, PM2.5 y Precipitación de estación Compartir#




Importación de Librerías

# Load libraries
import seaborn as sns
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# Load sklearn
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import GridSearchCV
from sklearn.linear_model import LinearRegression
from sklearn.linear_model import Lasso
from sklearn.linear_model import ElasticNet
from sklearn.tree import DecisionTreeRegressor
from sklearn.neighbors import KNeighborsRegressor
from sklearn.svm import SVR
from sklearn.pipeline import Pipeline
from sklearn.ensemble import RandomForestRegressor
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.ensemble import ExtraTreesRegressor
from sklearn.ensemble import AdaBoostRegressor
from sklearn.metrics import mean_squared_error

import warnings
warnings.filterwarnings("ignore")

A continuación usamos la función read_cvs() de la libreria pandaspara cargar los datos a nuestro entorno de trabajo.

df = pd.read_csv("data_2017_2022.csv", sep=";")
df_1 = df.copy()
df_1["medicion"]=df_1["medicion"].str.replace(",", ".").astype("float") # convertir variable medición a númerica
df_1['fecha'] = pd.to_datetime(df_1['fecha']) # convertir variable fecha a datatime
df_1 = df_1.pivot(index=["fecha", "estacion"],columns= "variable", values="medicion").reset_index()

Para más practicidad se renombran las variables de nuestro conjunto de datos.

df_1 = df_1.rename(columns={    
    'variable': 'var',
    'black_carbon': 'BC',
    'direccion_viento': 'WD',
    'humedad': 'HR',
    'lluvia': 'RF',
    'presion': 'P',
    'radiacion_solar': 'RS',
    'temperatura': 'AT',
    'temperatura_10_m': 'AT_10_m',
    'uv-pm': 'UV',
    'velocidad_viento': 'WS',
    'h2s': 'H2S',
    'no2': 'NO2',
    'o3': 'O3',
    'so2': 'SO2',
    'pm10': 'PM10',
    'pm25': 'PM2.5'  
})

Dado que la variable la variable \(\text{NO}_2\) tiene solo \(1\) medición entre \(473.256\) registros durante el periodo analizado, lo que representa casi un \(100\%\) de datos faltantes, hemos optado por excluirla del análisis.

df_t = df_1.copy()
df_t = df_t.drop(columns=["NO2"])
df_compartir = df_t[df_t['estacion'] == 'compartir']
df_base_aerea = df_t[df_t['estacion'] == 'base_aerea']
df_canaveralejo = df_t[df_t['estacion'] == 'canaveralejo']
df_era_obrero = df_t[df_t['estacion'] == 'era_obrero']
df_ermita = df_t[df_t['estacion'] == 'ermita']
df_flora = df_t[df_t['estacion'] == 'flora']
df_pance = df_t[df_t['estacion'] == 'pance']
df_transitoria = df_t[df_t['estacion'] == 'transitoria']
df_univalle = df_t[df_t['estacion'] == 'univalle']

Presión Atmosférica (P) #

import plotly.graph_objects as go
import pandas as pd

fig = go.Figure()

fig.add_trace(go.Scatter(
    x=df_compartir['fecha'],
    y=df_compartir['P'],
    mode='lines',  # Mostrar la línea
    line=dict(color='#30143F', width=2),  # Cambiar el color de la línea y el ancho
    name='Presión Atmosférica (hPa)',
    opacity=0.7  # Ajustar la opacidad de la línea (0.0 es completamente transparente, 1.0 es completamente opaco)
))


fig.update_layout(
    title='Presión Atmosférica a lo Largo del Tiempo',
    xaxis_title='Fecha',
    yaxis_title='Presión Atmosférica (hPa)', 
    xaxis=dict(tickangle=45, tickformat='%Y-%m-%d'), 
    yaxis=dict(tickformat='.1f'),  # Formato de los ticks del eje Y (un decimal)
    template='plotly_white',  # Fondo blanco 
    title_x=0.5,  # Centrar el título
    title_font=dict(size=16)  # Ajustar el tamaño de la fuente del título
)


fig.show()
import plotly.graph_objects as go

# Crear una nueva columna para identificar la fuente de los datos
df_compartir['source'] = 'Compartir'
df_ermita['source'] = 'Ermita'
df_era_obrero['source'] = 'Era Obrero'
df_canaveralejo['source'] = 'Canaveralejo'
df_base_aerea['source'] = 'Base Aerea'
df_pance['source'] = 'Pance'
df_flora['source'] = 'Flora'
df_transitoria['source'] = 'Transitoria'
df_univalle['source'] = 'UniValle'

# Combinar todos los DataFrames en uno solo
df_combined = pd.concat([df_compartir, df_ermita, df_era_obrero, df_canaveralejo, df_base_aerea, df_pance, df_flora, df_transitoria, df_univalle])



fig = go.Figure()

# Obtener la lista única de estaciones
estaciones = df_combined['source'].unique()

# Añadir una traza de línea para cada estación
for estacion in estaciones:
    df_subset = df_combined[df_combined['source'] == estacion]
    fig.add_trace(go.Scatter(
        x=df_subset['fecha'],
        y=df_subset['P'],
        mode='lines',
        name=estacion,  # Nombre de la estación para la leyenda
        line=dict(width=2),  # Ajustar el ancho de la línea si es necesario
        opacity=0.7  # Ajustar la opacidad de la línea
    ))

# Ajustar el diseño del gráfico
fig.update_layout(
    title='Presión Atmosférica a lo Largo del Tiempo por Estación',
    xaxis_title='Fecha',
    yaxis_title='Presión Atmosférica (hPa)',
    xaxis=dict(tickangle=45, tickformat='%Y-%m-%d'), 
    yaxis=dict(tickformat='.1f'),  # Formato de los ticks del eje Y (un decimal)
    template='plotly_white',  # Fondo blanco 
    title_x=0.5,  # Centrar el título
    title_font=dict(size=16)  # Ajustar el tamaño de la fuente del título
)

fig.show()
import plotly.express as px
import plotly.graph_objects as go


fig_density = px.histogram(df_compartir, x="P", marginal="box", nbins=50, title="Densidad de Presión Atmosférica Estación Compartir",
                           labels={'Presión Atmosférica (hPa)'}, color_discrete_sequence=['#30143F'])

fig_density.update_traces(
    marker=dict(color='#30143F', opacity=0.7),  # Ajustar la opacidad de las barras
    selector=dict(type='histogram')
)


fig_density.update_layout(
    xaxis_title="Presión Atmosférica (hPa)",
    yaxis_title="Frecuencia",
    showlegend=False
)


fig_density.show()
import plotly.graph_objects as go
import pandas as pd

# Crear la columna 'Año' basada en 'fecha'
df_compartir['Año'] = df_compartir['fecha'].dt.year

# Crear una lista única de años para el eje x
años = sorted(df_compartir['Año'].unique())

# Definir los colores para cada año
colores_años = ['#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f', '#d98e31', 
                '#e69c24', '#f2aa1c', '#f5b512', '#f8b902', '#f8b902', '#f8b902'] 

# Crear una figura usando plotly.graph_objects
figbox = go.Figure()

# Añadir trazas manualmente para cada año con colores específicos
for i, año in enumerate(años):
    df_subset = df_compartir[df_compartir['Año'] == año]
    figbox.add_trace(go.Box(
        y=df_subset['P'],
        name=str(año),
        marker_color=colores_años[i % len(colores_años)]  # Asignar un color específico a cada año
    ))

# Actualizar el diseño del gráfico
figbox.update_layout(
    title="Distribución de Presión Atmosférica por Año",
    xaxis_title="Año",
    yaxis_title="Presión Atmosférica (hPa)",
    title_x=0.5,  # Centrar el título
    xaxis=dict(
        title="Año",
        tickmode='array',
        tickvals=años,  # Asegurar que todos los años se muestran
        ticktext=[str(año) for año in años]  # Etiquetas para cada año
    )
)


figbox.show()

Debido a un aparente error en las mediciones registradas durante los años 2017 a 2019, se procederá a analizar las tendencias de las mediciones de presión para los años 2020 a 2022. Además, se eliminará la medición de 27,7 hPa registrada en septiembre de 2022, ya que este valor es erróneo, dado que la presión atmosférica generalmente se encuentra por encima de los 980 hPa.

import plotly.express as px
import pandas as pd

# Filtrar el DataFrame para incluir solo los años 2020, 2021, 2022
df_compartir_2020_2022 = df_compartir[df_compartir['fecha'].dt.year.isin([2020, 2021, 2022])]

# Eliminar las observaciones donde la columna 'P' es igual a 27.7
df_compartir_2020_2022 = df_compartir_2020_2022[df_compartir_2020_2022['P'] != 27.7]

# Crear una columna adicional para el año basado en la fecha
df_compartir_2020_2022['Año'] = df_compartir_2020_2022['fecha'].dt.year

# Crear una lista única de años para el eje x
años = sorted(df_compartir['Año'].unique())

# Definir los colores para cada año
colores_años = ['#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f', '#d98e31', 
                '#e69c24', '#f2aa1c', '#f5b512', '#f8b902', '#f8b902', '#f8b902'] 


figbox = go.Figure()

# Añadir trazas manualmente para cada año con colores específicos
for i, año in enumerate(años):
    df_subset = df_compartir_2020_2022[df_compartir_2020_2022['Año'] == año]
    figbox.add_trace(go.Box(
        y=df_subset['P'],
        name=str(año),
        marker_color=colores_años[i % len(colores_años)]  # Asignar un color específico a cada año
    ))

# Actualizar el diseño del gráfico
figbox.update_layout(
    title="Distribución de Presión Atmosférica por Año",
    xaxis_title="Año",
    yaxis_title="Presión Atmosférica (hPa)",
    title_x=0.5,  # Centrar el título
    xaxis=dict(
        title="Año",
        tickmode='array',
        tickvals=años,  # Asegurar que todos los años se muestran
        ticktext=[str(año) for año in años]  # Etiquetas para cada año
    )
)

# Mostrar el gráfico interactivo
figbox.show()
import plotly.graph_objects as go
import pandas as pd

# Definir el orden correcto de los meses en español
orden_meses = ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio",
               "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"]

# Crear un diccionario para mapear números de mes a nombres en español
nombres_meses = {i+1: mes for i, mes in enumerate(orden_meses)}

# Crear un diccionario para mapear nombres de mes a números
mes_a_numero = {mes: i+1 for i, mes in enumerate(orden_meses)}

# Definir una lista de colores para los meses
colores_meses = ['#30143F', '#432c4d', '#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f', '#d98e31', '#e69c24', '#f2aa1c', '#f5b512', '#f8b902']


df_compartir_2020_2022['fecha'] = pd.to_datetime(df_compartir_2020_2022['fecha'])

# Crear una columna adicional para el mes basado en la fecha
df_compartir_2020_2022['Mes'] = df_compartir_2020_2022['fecha'].dt.month.map(nombres_meses)

# Mapear los nombres de los meses a números para ordenar
df_compartir_2020_2022['Mes_Num'] = df_compartir_2020_2022['Mes'].map(mes_a_numero)

# Crear una figura usando plotly.graph_objects
figbox = go.Figure()

# Añadir trazas para cada mes con colores distintos
for mes, color in zip(orden_meses, colores_meses):
    df_subset = df_compartir_2020_2022[df_compartir_2020_2022['Mes'] == mes]
    figbox.add_trace(go.Box(
        y=df_subset['P'],
        name=mes,
        marker_color=color
    ))

# Actualizar el diseño del gráfico
figbox.update_layout(
    title="Distribución de Presión Atmosférica Mensual",
    xaxis_title="Mes",
    yaxis_title="Presión Atmosférica (hPa)",
    title_x=0.5,  # Centrar el título
    xaxis=dict(
        tickmode='array',
        tickvals=orden_meses,  # Asegurar que todos los meses se muestran en el orden correcto
        ticktext=orden_meses,  # Etiquetas para cada mes en el orden correcto
        categoryorder='array',  # Ordenar los meses en el orden especificado
        categoryarray=orden_meses  # Especificar el orden de los meses
    )
)

# Mostrar el gráfico interactivo
figbox.show()
import plotly.graph_objects as go
import pandas as pd

# Definir el orden correcto de los días de la semana en español
orden_dias = ["Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado", "Domingo"]

# Crear un diccionario para mapear números de día de la semana a nombres en español
nombres_dias = {i: dia for i, dia in enumerate(orden_dias, start=0)}

# Crear un diccionario para mapear nombres de días a números
dia_a_numero = {dia: i for i, dia in enumerate(orden_dias)}

# Definir una lista de colores para los días de la semana
colores_dias = ['#30143F', '#432c4d', '#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f']


# Crear una columna adicional para el día de la semana basado en la fecha
df_compartir['Día'] = df_compartir['fecha'].dt.day_name().map(lambda x: {
    'Monday': 'Lunes', 'Tuesday': 'Martes', 'Wednesday': 'Miércoles',
    'Thursday': 'Jueves', 'Friday': 'Viernes', 'Saturday': 'Sábado', 'Sunday': 'Domingo'
}[x])


# Crear una columna adicional para el mes basado en la fecha
df_compartir_2020_2022['Día'] = df_compartir_2020_2022['fecha'].dt.day.map(nombres_dias)

# Mapear los nombres de los días a números para ordenar
df_compartir_2020_2022['Día_Num'] = df_compartir_2020_2022['Día'].map(dia_a_numero)

# Crear una figura usando plotly.graph_objects
figbox = go.Figure()

# Añadir trazas para cada día de la semana con colores distintos
for dia, color in zip(orden_dias, colores_dias):
    df_subset = df_compartir_2020_2022[df_compartir_2020_2022['Día'] == dia]
    figbox.add_trace(go.Box(
        y=df_subset['P'],
        name=dia,
        marker_color=color
    ))

# Actualizar el diseño del gráfico
figbox.update_layout(
    title="Distribución Presión Atmosférica por Día de la Semana",
    xaxis_title="Día de la Semana",
    yaxis_title="Presión Atmosférica (hPa)",
    title_x=0.5,  # Centrar el título
    xaxis=dict(
        tickmode='array',
        tickvals=orden_dias,  # Asegurar que todos los días se muestran en el orden correcto
        ticktext=orden_dias,  # Etiquetas para cada día en el orden correcto
        categoryorder='array',  # Ordenar los días en el orden especificado
        categoryarray=orden_dias  # Especificar el orden de los días de la semana
    )
)

figbox.show()
import plotly.graph_objects as go
import pandas as pd

# Definir el orden correcto de las horas del día
orden_horas = [f"{i:02d}:00" for i in range(24)]

# Crear un diccionario para mapear números de hora a nombres
horas_a_numero = {f"{i:02d}:00": i for i in range(24)}

# Definir una lista de colores para las horas del día
colores_horas = ['#30143F', '#432c4d', '#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f', 
                 '#d98e31', '#e69c24', '#f2aa1c', '#f5b512', '#f8b902', '#f8d024', '#f4c433', 
                 '#f0b838', '#d8a73d', '#c09d42', '#a9914f', '#8c8e5a', '#6d8a65', '#51776c', 
                 '#356d6f', '#1e616c', '#115f6a', '#006f6f']


df_compartir_2020_2022['fecha'] = pd.to_datetime(df_compartir_2020_2022['fecha'])

# Crear una columna adicional para la hora basada en la fecha
df_compartir_2020_2022['Hora'] = df_compartir_2020_2022['fecha'].dt.hour.map(lambda x: f"{x:02d}:00")

# Mapear las horas a números para ordenar
df_compartir_2020_2022['Hora_Num'] = df_compartir_2020_2022['Hora'].map(horas_a_numero)

# Crear una figura usando plotly.graph_objects
figbox = go.Figure()

# Añadir trazas para cada hora con colores distintos
for hora, color in zip(orden_horas, colores_horas):
    df_subset = df_compartir_2020_2022[df_compartir_2020_2022['Hora'] == hora]
    figbox.add_trace(go.Box(
        y=df_subset['P'],
        name=hora,
        marker_color=color
    ))

# Actualizar el diseño del gráfico
figbox.update_layout(
    title="Distribución de Presión Atmosférica por Hora del Día",
    xaxis_title="Hora del Día",
    yaxis_title="Presión Atmosférica(hPa)",
    title_x=0.5,  # Centrar el título
    xaxis=dict(
        tickmode='array',
        tickvals=orden_horas,  # Asegurar que todas las horas se muestran en el orden correcto
        ticktext=orden_horas,  # Etiquetas para cada hora en el orden correcto
        categoryorder='array',  # Ordenar las horas en el orden especificado
        categoryarray=orden_horas  # Especificar el orden de las horas
    )
)


figbox.show()

En el análisis de los gráficos, se observa una tendencia consistente en la concentración de la ,presión (hPa) al segmentar los datos por año, mes y día de la semana. Sin embargo, al examinar las horas del día, se identifica un patrón notable: entre las 12 p.m. y las 3 p.m., la mediana de la presión muestra una ligera disminución. Después de esta franja horaria, la presión se mantiene relativamente constante hasta aproximadamente las 5 p.m. Posteriormente, se registra un leve incremento en la presión. Este comportamiento sugiere una distribución cercana a la normal, ya que la dispersión de los registros horarios permanece relativamente constante a lo largo del tiempo.

Material Particulado de 2.5\(\mu m\) (PM2.5) #

import plotly.graph_objects as go
import pandas as pd



fig = go.Figure()

# Añadir la traza de la línea
fig.add_trace(go.Scatter(
    x=df_compartir['fecha'],
    y=df_compartir['PM2.5'],
    mode='lines',  # Mostrar la línea
    line=dict(color='#30143F', width=2),  # Cambiar el color de la línea y el ancho
    name='PM2.5 (µg/m³)',
    opacity=0.7  # Ajustar la opacidad de la línea (0.0 es completamente transparente, 1.0 es completamente opaco)
))

# Ajustar el diseño del gráfico
fig.update_layout(
    title='PM2.5 a lo Largo del Tiempo',
    xaxis_title='Fecha',
    yaxis_title='PM2.5 (µg/m³)',  
    xaxis=dict(tickangle=45, tickformat='%Y-%m-%d'),  
    yaxis=dict(tickformat='.1f'),  # Formato de los ticks del eje Y (un decimal)
    template='plotly_white',  # Fondo blanco 
    title_x=0.5,  # Centrar el título
    title_font=dict(size=16)  # Ajustar el tamaño de la fuente del título
)


fig.show()
import plotly.express as px
import plotly.graph_objects as go

# Gráfico de densidad interactivo usando Plotly Express
fig_density = px.histogram(df_compartir, x="PM2.5", marginal="box", nbins=50, title="Densidad de PM2.5 Estación Compartir",
                           labels={'PM2.5': 'PM2.5 (µg/m³)'}, color_discrete_sequence=['#30143F'])

# Ajustar la opacidad de las barras y el boxplot en el gráfico de densidad
fig_density.update_traces(
    marker=dict(color='#30143F', opacity=0.7),  # Ajustar la opacidad de las barras
    selector=dict(type='histogram')
)

# Ajustar el diseño del gráfico de densidad
fig_density.update_layout(
    xaxis_title="PM2.5 (µg/m³)",
    yaxis_title="Frecuencia",
    showlegend=False
)


fig_density.show()
import plotly.graph_objects as go
import pandas as pd

# Crear una lista única de años para el eje x
años = sorted(df_compartir['Año'].unique())

# Definir los colores para cada año
colores_años = ['#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f', '#d98e31', 
                '#e69c24', '#f2aa1c', '#f5b512', '#f8b902', '#f8b902', '#f8b902'] 

# Crear una figura usando plotly.graph_objects
figbox = go.Figure()

# Añadir trazas manualmente para cada año con colores específicos
for i, año in enumerate(años):
    df_subset = df_compartir[df_compartir['Año'] == año]
    figbox.add_trace(go.Box(
        y=df_subset['PM2.5'],
        name=str(año),
        marker_color=colores_años[i % len(colores_años)]  # Asignar un color específico a cada año
    ))

# Actualizar el diseño del gráfico
figbox.update_layout(
    title="Distribución de PM2.5 por Año",
    xaxis_title="Año",
    yaxis_title="PM2.5 (µg/m³)",
    title_x=0.5,  # Centrar el título
    xaxis=dict(
        title="Año",
        tickmode='array',
        tickvals=años,  # Asegurar que todos los años se muestran
        ticktext=[str(año) for año in años]  # Etiquetas para cada año
    )
)


figbox.show()
import plotly.graph_objects as go
import pandas as pd

# Definir el orden correcto de los meses en español
orden_meses = ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio",
               "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"]

# Crear un diccionario para mapear números de mes a nombres en español
nombres_meses = {i+1: mes for i, mes in enumerate(orden_meses)}

# Crear un diccionario para mapear nombres de mes a números
mes_a_numero = {mes: i+1 for i, mes in enumerate(orden_meses)}

# Definir una lista de colores para los meses
colores_meses = ['#30143F', '#432c4d', '#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f', '#d98e31', '#e69c24', '#f2aa1c', '#f5b512', '#f8b902']


# Crear una columna adicional para el mes basado en la fecha
df_compartir['Mes'] = df_compartir['fecha'].dt.month.map(nombres_meses)

# Mapear los nombres de los meses a números para ordenar
df_compartir['Mes_Num'] = df_compartir['Mes'].map(mes_a_numero)

# Crear una figura usando plotly.graph_objects
figbox = go.Figure()

# Añadir trazas para cada mes con colores distintos
for mes, color in zip(orden_meses, colores_meses):
    df_subset = df_compartir[df_compartir['Mes'] == mes]
    figbox.add_trace(go.Box(
        y=df_subset['PM2.5'],
        name=mes,
        marker_color=color
    ))

# Actualizar el diseño del gráfico
figbox.update_layout(
    title="Distribución de PM2.5 Mensual",
    xaxis_title="Mes",
    yaxis_title="PM2.5 (µg/m³)",
    title_x=0.5,  # Centrar el título
    xaxis=dict(
        tickmode='array',
        tickvals=orden_meses,  
        ticktext=orden_meses,  
        categoryorder='array',  # Ordenar los meses en el orden especificado
        categoryarray=orden_meses  # Especificar el orden de los meses
    )
)


figbox.show()
import plotly.graph_objects as go
import pandas as pd

# Definir el orden correcto de los días de la semana en español
orden_dias = ["Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado", "Domingo"]

# Crear un diccionario para mapear números de día de la semana a nombres en español
nombres_dias = {i: dia for i, dia in enumerate(orden_dias, start=0)}

# Crear un diccionario para mapear nombres de días a números
dia_a_numero = {dia: i for i, dia in enumerate(orden_dias)}

# Definir una lista de colores para los días de la semana
colores_dias = ['#30143F', '#432c4d', '#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f']


# Crear una columna adicional para el día de la semana basado en la fecha
df_compartir['Día'] = df_compartir['fecha'].dt.day_name().map(lambda x: {
    'Monday': 'Lunes', 'Tuesday': 'Martes', 'Wednesday': 'Miércoles',
    'Thursday': 'Jueves', 'Friday': 'Viernes', 'Saturday': 'Sábado', 'Sunday': 'Domingo'
}[x])

# Mapear los nombres de los días a números para ordenar
df_compartir['Día_Num'] = df_compartir['Día'].map(dia_a_numero)

# Crear una figura usando plotly.graph_objects
figbox = go.Figure()

# Añadir trazas para cada día de la semana con colores distintos
for dia, color in zip(orden_dias, colores_dias):
    df_subset = df_compartir[df_compartir['Día'] == dia]
    figbox.add_trace(go.Box(
        y=df_subset['PM2.5'],
        name=dia,
        marker_color=color
    ))

# Actualizar el diseño del gráfico
figbox.update_layout(
    title="Distribución PM2.5 por Día de la Semana",
    xaxis_title="Día de la Semana",
    yaxis_title="PM2.5 (µg/m³)",
    title_x=0.5,  # Centrar el título
    xaxis=dict(
        tickmode='array',
        tickvals=orden_dias,  # Asegurar que todos los días se muestran en el orden correcto
        ticktext=orden_dias,  # Etiquetas para cada día en el orden correcto
        categoryorder='array',  # Ordenar los días en el orden especificado
        categoryarray=orden_dias  # Especificar el orden de los días de la semana
    )
)


figbox.show()
import plotly.graph_objects as go
import pandas as pd

# Definir el orden correcto de las horas del día
orden_horas = [f"{i:02d}:00" for i in range(24)]

# Crear un diccionario para mapear números de hora a nombres
horas_a_numero = {f"{i:02d}:00": i for i in range(24)}

# Definir una lista de colores para las horas del día
colores_horas = ['#30143F', '#432c4d', '#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f', 
                 '#d98e31', '#e69c24', '#f2aa1c', '#f5b512', '#f8b902', '#f8d024', '#f4c433', 
                 '#f0b838', '#d8a73d', '#c09d42', '#a9914f', '#8c8e5a', '#6d8a65', '#51776c', 
                 '#356d6f', '#1e616c', '#115f6a', '#006f6f']


# Crear una columna adicional para la hora basada en la fecha
df_compartir['Hora'] = df_compartir['fecha'].dt.hour.map(lambda x: f"{x:02d}:00")

# Mapear las horas a números para ordenar
df_compartir['Hora_Num'] = df_compartir['Hora'].map(horas_a_numero)


figbox = go.Figure()

# Añadir trazas para cada hora con colores distintos
for hora, color in zip(orden_horas, colores_horas):
    df_subset = df_compartir[df_compartir['Hora'] == hora]
    figbox.add_trace(go.Box(
        y=df_subset['PM2.5'],
        name=hora,
        marker_color=color
    ))

# Actualizar el diseño del gráfico
figbox.update_layout(
    title="Distribución de PM2.5 por Hora del Día",
    xaxis_title="Hora del Día",
    yaxis_title="PM2.5 (µg/m³)",
    title_x=0.5,  # Centrar el título
    xaxis=dict(
        tickmode='array',
        tickvals=orden_horas,
        ticktext=orden_horas, 
        categoryorder='array',  # Ordenar las horas en el orden especificado
        categoryarray=orden_horas  # Especificar el orden de las horas
    )
)


figbox.show()

En relación con los gráficos analizados, se observa una tendencia consistente en la concentración de PM2.5 (µg/m³) al segmentar los datos por año, mes y día de la semana. Sin embargo, al examinar las horas del día, se identifica que entre las 5 y 7 a.m. y 4 p.m. y 7 p.m. se presenta una mayor dispersión en los datos de concentración de PM2.5registrados. Esto sugiere la posible presencia de eventos que elevan los niveles de PM2.5 durante esas franjas horarias, mostrando un comportamiento similar en comparación con la tendencia que presenta la concentración de PM10.

Precipitación (RF)#

import plotly.graph_objects as go
import pandas as pd


fig = go.Figure()


fig.add_trace(go.Scatter(
    x=df_compartir['fecha'],
    y=df_compartir['RF'],
    mode='lines',  # Mostrar la línea
    line=dict(color='#30143F', width=2),  # Cambiar el color de la línea y el ancho
    name='Precipitación (mm)',
    opacity=0.7  # Ajustar la opacidad de la línea (0.0 es completamente transparente, 1.0 es completamente opaco)
))


fig.update_layout(
    title='Volumen de Precipitación a lo Largo del Tiempo',
    xaxis_title='Fecha',
    yaxis_title='Precipitación (mm)', 
    xaxis=dict(tickangle=45, tickformat='%Y-%m-%d'),  # Rotar etiquetas del eje X y formato de fecha
    yaxis=dict(tickformat='.1f'),  # Formato de los ticks del eje Y (un decimal)
    template='plotly_white',  # Fondo blanco 
    title_x=0.5,  # Centrar el título
    title_font=dict(size=16)  # Ajustar el tamaño de la fuente del título
)


fig.show()
import plotly.express as px
import plotly.graph_objects as go

# Gráfico de densidad interactivo usando Plotly Express
fig_density = px.histogram(df_compartir, x="RF", marginal="box", nbins=50, title="Densidad de Precipitación Estación Compartir",
                           labels={'Precipitación (mm)'}, color_discrete_sequence=['#30143F'])

# Ajustar la opacidad de las barras y el boxplot en el gráfico de densidad
fig_density.update_traces(
    marker=dict(color='#30143F', opacity=0.7),  # Ajustar la opacidad de las barras
    selector=dict(type='histogram')
)

# Ajustar el diseño del gráfico de densidad
fig_density.update_layout(
    xaxis_title="Precipitación (mm)",
    yaxis_title="Frecuencia",
    showlegend=False
)

# Mostrar ambos gráficos en celdas separadas
fig_density.show()
import plotly.graph_objects as go
import pandas as pd


# Crear una columna adicional para el año basado en la fecha
df_compartir['Año'] = df_compartir['fecha'].dt.year

# Agrupar por año y sumar las precipitaciones
df_anual = df_compartir.groupby('Año')['RF'].sum().reset_index()

# Definir los colores para cada año
colores_años = ['#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f', '#d98e31', 
                '#e69c24', '#f2aa1c', '#f5b512', '#f8b902', '#f8b902', '#f8b902']  


fig = go.Figure()

# Añadir trazas manualmente para cada año con colores específicos
for i, año in enumerate(df_anual['Año']):
    df_subset = df_anual[df_anual['Año'] == año]
    fig.add_trace(go.Bar(
        x=[str(año)],  # Usar una lista para x porque hay un solo valor por barra
        y=df_subset['RF'],
        name=str(año),
        marker_color=colores_años[i % len(colores_años)]  # Asignar un color específico a cada año
    ))

# Actualizar el diseño del gráfico
fig.update_layout(
    title="Distribución de Precipitación por Año",
    xaxis_title="Año",
    yaxis_title="Precipitación (mm)",
    title_x=0.5,  # Centrar el título
    xaxis=dict(
        title="Año",
        tickmode='array',
        tickvals=df_anual['Año'],  # Asegurar que todos los años se muestran
        ticktext=[str(año) for año in df_anual['Año']]  # Etiquetas para cada año
    ),
    template='plotly_white'  # Fondo blanco para mejorar la visualización
)


fig.show()
import pandas as pd
import plotly.graph_objects as go

# Definir el orden correcto de los meses en español
orden_meses = ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio",
               "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"]

# Crear un diccionario para mapear números de mes a nombres en español
nombres_meses = {i+1: mes for i, mes in enumerate(orden_meses)}

# Crear un diccionario para mapear nombres de mes a números
mes_a_numero = {mes: i+1 for i, mes in enumerate(orden_meses)}

# Definir una lista de colores para los meses
colores_meses = ['#30143F', '#432c4d', '#5a3b59', '#734764', '#8f615c', '#a86e4f', 
                 '#c67e3f', '#d98e31', '#e69c24', '#f2aa1c', '#f5b512', '#f8b902']


# Crear una columna adicional para el mes basado en la fecha
df_compartir['Mes'] = df_compartir['fecha'].dt.month.map(nombres_meses)

# Mapear los nombres de los meses a números para ordenar
df_compartir['Mes_Num'] = df_compartir['Mes'].map(mes_a_numero)

# Agrupar por mes y sumar las precipitaciones
df_mensual = df_compartir.groupby('Mes')['RF'].sum().reset_index()

# Asegurarse de que los meses estén en el orden correcto
df_mensual['Mes'] = pd.Categorical(df_mensual['Mes'], categories=orden_meses, ordered=True)
df_mensual = df_mensual.sort_values('Mes')

# Crear una figura usando plotly.graph_objects
figbox = go.Figure()

# Añadir trazas para cada mes con colores distintos
for mes, color in zip(orden_meses, colores_meses):
    df_subset = df_mensual[df_mensual['Mes'] == mes]
    figbox.add_trace(go.Bar(
        x=df_subset['Mes'],
        y=df_subset['RF'],
        name=mes,
        marker_color=color
    ))

# Actualizar el diseño del gráfico
figbox.update_layout(
    title="Distribución de Precipitación Mensual",
    xaxis_title="Mes",
    yaxis_title="Precipitación (mm)",
    title_x=0.5,  # Centrar el título
    xaxis=dict(
        tickmode='array',
        tickvals=orden_meses,  
        ticktext=orden_meses, 
        categoryorder='array',  # Ordenar los meses en el orden especificado
        categoryarray=orden_meses  # Especificar el orden de los meses
    ),
    template='plotly_white'  # Fondo blanco 
)


figbox.show()
import plotly.graph_objects as go
import pandas as pd

# Definir el orden correcto de los días de la semana en español
orden_dias = ["Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado", "Domingo"]

# Crear un diccionario para mapear números de día de la semana a nombres en español
nombres_dias = {i: dia for i, dia in enumerate(orden_dias, start=0)}

# Crear un diccionario para mapear nombres de días a números
dia_a_numero = {dia: i for i, dia in enumerate(orden_dias)}

# Definir una lista de colores para los días de la semana
colores_dias = ['#30143F', '#432c4d', '#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f']


# Crear una columna adicional para el día de la semana basado en la fecha
df_compartir['Día'] = df_compartir['fecha'].dt.day_name().map(lambda x: {
    'Monday': 'Lunes', 'Tuesday': 'Martes', 'Wednesday': 'Miércoles',
    'Thursday': 'Jueves', 'Friday': 'Viernes', 'Saturday': 'Sábado', 'Sunday': 'Domingo'
}[x])

# Mapear los nombres de los días a números para ordenar
df_compartir['Día_Num'] = df_compartir['Día'].map(dia_a_numero)

# Agrupar por día de la semana y sumar las precipitaciones
df_semanal = df_compartir.groupby('Día')['RF'].sum().reset_index()

# Asegurarse de que los días de la semana estén en el orden correcto
df_semanal['Día'] = pd.Categorical(df_semanal['Día'], categories=orden_dias, ordered=True)
df_semanal = df_semanal.sort_values('Día')


figbox = go.Figure()

# Añadir la traza de barras para cada día de la semana
figbox.add_trace(go.Bar(
    x=df_semanal['Día'],
    y=df_semanal['RF'],
    marker_color=colores_dias  # Usar colores definidos
))

# Actualizar el diseño del gráfico
figbox.update_layout(
    title="Distribución de Precipitación por Día de la Semana",
    xaxis_title="Día de la Semana",
    yaxis_title="Precipitación (mm)",
    title_x=0.5,  # Centrar el título
    xaxis=dict(
        tickmode='array',
        tickvals=orden_dias,  
        ticktext=orden_dias,  
        categoryorder='array',  # Ordenar los días en el orden especificado
        categoryarray=orden_dias  # Especificar el orden de los días de la semana
    ),
    template='plotly_white'  # Fondo blanco 
)


figbox.show()
import plotly.graph_objects as go
import pandas as pd

# Definir el orden correcto de las horas del día
orden_horas = [f"{i:02d}:00" for i in range(24)]

# Crear un diccionario para mapear números de hora a nombres
horas_a_numero = {f"{i:02d}:00": i for i in range(24)}

# Definir una lista de colores para las horas del día
colores_horas = ['#30143F', '#432c4d', '#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f', 
                 '#d98e31', '#e69c24', '#f2aa1c', '#f5b512', '#f8b902', '#f8d024', '#f4c433', 
                 '#f0b838', '#d8a73d', '#c09d42', '#a9914f', '#8c8e5a', '#6d8a65', '#51776c', 
                 '#356d6f', '#1e616c', '#115f6a', '#006f6f']


# Crear una columna adicional para la hora basada en la fecha
df_compartir['Hora'] = df_compartir['fecha'].dt.hour.map(lambda x: f"{x:02d}:00")

# Mapear las horas a números para ordenar
df_compartir['Hora_Num'] = df_compartir['Hora'].map(horas_a_numero)

# Agrupar por hora y sumar las precipitaciones
df_diario = df_compartir.groupby('Hora')['RF'].sum().reset_index()

# Asegurarse de que las horas estén en el orden correcto
df_diario['Hora'] = pd.Categorical(df_diario['Hora'], categories=orden_horas, ordered=True)
df_diario = df_diario.sort_values('Hora')

# Crear una figura usando plotly.graph_objects
figbox = go.Figure()

# Añadir la traza de barras para cada hora del día
figbox.add_trace(go.Bar(
    x=df_diario['Hora'],
    y=df_diario['RF'],
    marker_color=colores_horas  # Usar colores definidos
))

# Actualizar el diseño del gráfico
figbox.update_layout(
    title="Distribución de Precipitación (mm) por Hora del Día",
    xaxis_title="Hora del Día",
    yaxis_title="Precipitación (mm)",
    title_x=0.5,  # Centrar el título
    xaxis=dict(
        tickmode='array',
        tickvals=orden_horas,  # Asegurar que todas las horas se muestran en el orden correcto
        ticktext=orden_horas,  # Etiquetas para cada hora en el orden correcto
        categoryorder='array',  # Ordenar las horas en el orden especificado
        categoryarray=orden_horas  # Especificar el orden de las horas
    ),
    template='plotly_white'  # Fondo blanco para mejorar la visualización
)


figbox.show()

A continuación realizaremos un análisis del comportamiento de la Precipitación según la intesidad. Para ello, hemos definido los siguientes intervalos de precipitación:

  • Lluvia Nula: Nivel de precipitación igual a 0 mm.

  • Lluvia Ligera: Nivel de precipitación mayor a 0 mm y hasta 5 mm, inclusive.

  • Lluvia Moderada: Nivel de precipitación mayor a 5 mm y hasta 20 mm, inclusive.

  • Lluvia Intensa: Nivel de precipitación superior a 20 mm.

Estos intervalos nos permitirán clasificar y comprender mejor la intensidad de las precipitaciones registradas, facilitando así una interpretación más clara del comportamiento de la lluvia en los datos analizados.

bins = [-np.inf, 0, 5, 20, np.inf]  # Intervalos de precipitación
labels = ['Lluvia Nula', 'Lluvia Ligera', 'Lluvia Moderada', 'Lluvia Intensa']  # Etiquetas

# Crear la nueva columna 'RF_INTENSITY' con las categorías
df_compartir['RF_INTENSITY'] = pd.cut(df_compartir['RF'], bins=bins, labels=labels, right=True)

# Convertir la columna 'RF_INTENSITY' a tipo categórico con el orden deseado
df_compartir['RF_INTENSITY'] = pd.Categorical(df_compartir['RF_INTENSITY'], categories=labels, ordered=True)
import plotly.graph_objects as go


# Crear una columna adicional para el año basado en la fecha
df_compartir['Año'] = df_compartir['fecha'].dt.year

# Contar el número de ocurrencias de cada categoría de intensidad por año
df_count = df_compartir.groupby(['Año', 'RF_INTENSITY']).size().reset_index(name='Conteo')

# Crear una figura usando plotly.graph_objects
figbar = go.Figure()

# Añadir trazas manualmente para cada categoría
figbar.add_trace(go.Bar(
    x=df_count[df_count['RF_INTENSITY'] == 'Lluvia Nula']['Año'],
    y=df_count[df_count['RF_INTENSITY'] == 'Lluvia Nula']['Conteo'],
    name='Lluvia Nula',
    marker_color='#30143F'
))

figbar.add_trace(go.Bar(
    x=df_count[df_count['RF_INTENSITY'] == 'Lluvia Ligera']['Año'],
    y=df_count[df_count['RF_INTENSITY'] == 'Lluvia Ligera']['Conteo'],
    name='Lluvia Ligera',
    marker_color='#7D3F2A'
))

figbar.add_trace(go.Bar(
    x=df_count[df_count['RF_INTENSITY'] == 'Lluvia Moderada']['Año'],
    y=df_count[df_count['RF_INTENSITY'] == 'Lluvia Moderada']['Conteo'],
    name='Lluvia Moderada',
    marker_color='#B0453D'
))

figbar.add_trace(go.Bar(
    x=df_count[df_count['RF_INTENSITY'] == 'Lluvia Intensa']['Año'],
    y=df_count[df_count['RF_INTENSITY'] == 'Lluvia Intensa']['Conteo'],
    name='Lluvia Intensa',
    marker_color='#F28D35'
))

# Actualizar el diseño del gráfico
figbar.update_layout(
    title="Distribución de la Intensidad de Lluvia por Año",
    xaxis_title="Año",
    yaxis_title="Número de Observaciones",
    barmode='group',  # Mostrar barras al lado una de la otra
    title_x=0.5,  # Centrar el título
    xaxis=dict(
        tickmode='linear'  # Asegurar que los ticks en el eje x son lineales para mejor visualización
    )
)

figbar.show()
import plotly.graph_objects as go
import pandas as pd

# Definir el orden correcto de los meses en español
orden_meses = ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio",
               "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"]

# Crear un diccionario para mapear números de mes a nombres en español
nombres_meses = {i+1: mes for i, mes in enumerate(orden_meses)}

# Crear un diccionario para mapear nombres de mes a números
mes_a_numero = {mes: i+1 for i, mes in enumerate(orden_meses)}

# Crear una columna adicional para el mes basado en la fecha
df_compartir['Mes'] = df_compartir['fecha'].dt.month.map(nombres_meses)

# Mapear los nombres de los meses a números para ordenar
df_compartir['Mes_Num'] = df_compartir['Mes'].map(mes_a_numero)

# Contar el número de ocurrencias de cada categoría de intensidad por mes
df_count_mes = df_compartir.groupby(['Mes', 'RF_INTENSITY', 'Mes_Num']).size().reset_index(name='Conteo')

# Crear una figura usando plotly.graph_objects
figbar = go.Figure()

# Añadir trazas manualmente para cada categoría
for intensidad, color in zip(['Lluvia Nula', 'Lluvia Ligera', 'Lluvia Moderada', 'Lluvia Intensa'],
                              ['#30143F', '#7D3F2A', '#B0453D', '#F28D35']):
    df_subset = df_count_mes[df_count_mes['RF_INTENSITY'] == intensidad]
    figbar.add_trace(go.Bar(
        x=df_subset['Mes'],
        y=df_subset['Conteo'],
        name=intensidad,
        marker_color=color
    ))

# Actualizar el diseño del gráfico
figbar.update_layout(
    title="Distribución de la Intensidad de Lluvia Mensual",
    xaxis_title="Mes",
    yaxis_title="Número de Observaciones",
    barmode='group',  # Mostrar barras al lado una de la otra
    title_x=0.5,  # Centrar el título
    xaxis=dict(
        tickmode='array',
        tickvals=orden_meses,  # Asegurar que todos los meses se muestran en el orden correcto
        ticktext=orden_meses,  # Etiquetas para cada mes en el orden correcto
        categoryorder='array',  # Ordenar los meses en el orden especificado
        categoryarray=orden_meses  # Especificar el orden de los meses
    )
)


figbar.show()
import plotly.graph_objects as go
import pandas as pd

# Definir el orden correcto de los días de la semana en español
orden_dias = ['Lunes', 'Martes', 'Miércoles', 'Jueves', 'Viernes', 'Sábado', 'Domingo']

# Crear un diccionario para mapear los nombres de los días de inglés a español
dias_ingles_espanol = {
    'Monday': 'Lunes', 'Tuesday': 'Martes', 'Wednesday': 'Miércoles',
    'Thursday': 'Jueves', 'Friday': 'Viernes', 'Saturday': 'Sábado', 'Sunday': 'Domingo'
}


# Crear una columna adicional para el día de la semana basado en la fecha
df_compartir['Día de la Semana'] = df_compartir['fecha'].dt.day_name().map(dias_ingles_espanol)

# Contar el número de ocurrencias de cada categoría de intensidad por día de la semana
df_count_dia = df_compartir.groupby(['Día de la Semana', 'RF_INTENSITY']).size().reset_index(name='Conteo')

# Crear una figura usando plotly.graph_objects
figbar = go.Figure()

# Añadir trazas manualmente para cada intensidad de lluvia
intensidades = ['Lluvia Nula', 'Lluvia Ligera', 'Lluvia Moderada', 'Lluvia Intensa']
colores = ['#30143F', '#7D3F2A', '#B0453D', '#F28D35']

for intensidad, color in zip(intensidades, colores):
    df_subset = df_count_dia[df_count_dia['RF_INTENSITY'] == intensidad]
    figbar.add_trace(go.Bar(
        x=df_subset['Día de la Semana'],
        y=df_subset['Conteo'],
        name=intensidad,
        marker_color=color
    ))

# Actualizar el diseño del gráfico
figbar.update_layout(
    title="Distribución de la Intensidad de Lluvia por Día de la Semana",
    xaxis_title="Día de la Semana",
    yaxis_title="Número de Observaciones",
    barmode='group',  # Mostrar barras al lado una de la otra
    title_x=0.5,  # Centrar el título
    xaxis=dict(
        tickmode='array',
        tickvals=orden_dias,  # Asegurar que todos los días se muestran en el orden correcto
        ticktext=orden_dias,  # Etiquetas para cada día en el orden correcto
        categoryorder='array',  # Ordenar los días de la semana en el orden especificado
        categoryarray=orden_dias  # Especificar el orden de los días de la semana
    )
)

figbar.show()
import plotly.graph_objects as go
import pandas as pd


# Crear una columna adicional para la hora del día basado en la fecha
df_compartir['Hora'] = df_compartir['fecha'].dt.hour.map(lambda x: f'{x:02d}:00')

# Contar el número de ocurrencias de cada categoría de intensidad por hora
df_count_hora = df_compartir.groupby(['Hora', 'RF_INTENSITY']).size().reset_index(name='Conteo')

# Definir el orden correcto de las horas del día en formato HH:00
orden_horas = [f'{i:02d}:00' for i in range(24)]


figbar = go.Figure()

# Añadir trazas manualmente para cada intensidad de lluvia
intensidades = ['Lluvia Nula', 'Lluvia Ligera', 'Lluvia Moderada', 'Lluvia Intensa']
colores = ['#30143F', '#7D3F2A', '#B0453D', '#F28D35']

for intensidad, color in zip(intensidades, colores):
    df_subset = df_count_hora[df_count_hora['RF_INTENSITY'] == intensidad]
    figbar.add_trace(go.Bar(
        x=df_subset['Hora'],
        y=df_subset['Conteo'],
        name=intensidad,
        marker_color=color
    ))

# Actualizar el diseño del gráfico
figbar.update_layout(
    title="Distribución de la Intensidad de Lluvia por Hora del Día",
    xaxis_title="Hora del Día",
    yaxis_title="Número de Observaciones",
    barmode='group',  # Mostrar barras al lado una de la otra
    title_x=0.5,  # Centrar el título
    xaxis=dict(
        tickmode='array',
        tickvals=orden_horas,  
        ticktext=orden_horas,  # Etiquetas para cada hora en el formato HH:00
        categoryorder='array',  # Ordenar las horas en el orden especificado
        categoryarray=orden_horas  # Especificar el orden de las horas del día
    ),
    template='plotly_white'  # Fondo blanco para mejorar la visualización
)


figbar.show()

En relación con los gráficos analizados, se observa una tendencia consistente en la intensidad de la lluvia al segmentar los datos por año, mes y día de la semana e incluso por horas del día. Donde se observa claramente una tendencia donde predomina la ausencia de lluvia y picos de lluvia intensa.